#include "gutils.h"
#include "ui_gutils.h"

GUtils::GUtils(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::GUtils)
{
    ui->setupUi(this);


    db = QSqlDatabase::database("user");

    //Mise a zero des variables d'id
    idPromsModifier = 0;
    utilisateurSelected = 0;


    // ------------------------  Initialisation de la page promotion du dock gauche ----------------------------------------

    // Désactivation des éléments inutiles
    ui->buttonProSupprimer->setEnabled(false);
    ui->groupProDetail->setEnabled(false);

    // Récupération des promotions
    modelListProms = new QSqlQueryModel();
    modelListProms->setQuery("SELECT id, CONCAT(centre,' ',annee,statut) FROM promotions ORDER BY centre, annee",db);
    ui->listProProms->setModel(modelListProms);
    ui->listProProms->setModelColumn(1);

    // ------------------------  Initialisation de la page Détails du dock gauche ----------------------------------------

    // Désactivation des éléments inutiles
    ui->pageDetail->setEnabled(false);

    // Récupération des promotions
    ui->comboDetailProms->setModel(modelListProms);
    ui->comboDetailProms->setModelColumn(1);

    // ------------------------  Initialisation de la page Filtre du dock gauche ----------------------------------------

    ui->comboFiltreProms->setModel(modelListProms);
    ui->comboFiltreProms->setModelColumn(1);
    ui->comboFiltreProms->setEnabled(false);
    connect(ui->checkFiltreProms,SIGNAL(toggled(bool)),ui->comboFiltreProms,SLOT(setEnabled(bool)));

    // ------------------------  Initialisation de l'onglet utilisateur ----------------------------------------------------

    //Charger le model
    modelUtilisateurs = new QSqlTableModel(this,db);
    modelUtilisateurs->setTable("v_users");
    modelUtilisateurs->setEditStrategy(QSqlTableModel::OnManualSubmit);
    modelUtilisateurs->select();
    modelUtilisateurs->setHeaderData(0,Qt::Horizontal,"Id");
    modelUtilisateurs->setHeaderData(1,Qt::Horizontal,"Bucque");
    modelUtilisateurs->setHeaderData(2,Qt::Horizontal,"Fam's");
    modelUtilisateurs->setHeaderData(3,Qt::Horizontal,"Prom's");
    modelUtilisateurs->setHeaderData(4,Qt::Horizontal,"Pseudo");
    modelUtilisateurs->setHeaderData(5,Qt::Horizontal,"Solde");
    modelUtilisateurs->setHeaderData(6,Qt::Horizontal,"Actif");
    ui->tableUtilisateurs->setModel(modelUtilisateurs);

    //Charger le delegate
    MoneyDelegate *moneydelegate = new MoneyDelegate(ui->tableUtilisateurs);
    ui->tableUtilisateurs->setItemDelegateForColumn(5,moneydelegate);

    ui->tableUtilisateurs->resizeColumnsToContents();


    // ------------------------  Initialisation de l'onglet Virements internes ----------------------------------------------------
    modelVirInt = new QSqlQueryModel(this);
    ui->tableVirInt->setModel(modelVirInt);

    MoneyDelegate *mdVI = new MoneyDelegate(ui->tableVirInt);
    ui->tableVirInt->setItemDelegateForColumn(3,mdVI);

    QDateTime dateAu = QDateTime(QDate::currentDate());
    ui->dateVirIntAu->setDateTime(dateAu);
    QDateTime dateDu = dateAu;
    dateDu.addMonths(-1);
    ui->dateVirIntDu->setDateTime(dateDu);

}

GUtils::~GUtils()
{
    delete ui;

    //Dock gauche Promotions
    delete modelListProms;

    //Tab Utilisateurs
    delete modelUtilisateurs;

}

void GUtils::on_listProProms_clicked(const QModelIndex &index)
{
    //Récupération de l'id de proms
    QSqlQuery q1(db);
    q1.prepare("SELECT get_proms(:p)");
    q1.bindValue(":p",index.data().toString());
    q1.exec();
    q1.first();
    idPromsModifier = q1.value(0).toInt();
    q1.finish();

    //Récupération des informations
    q1.prepare("SELECT * FROM promotions WHERE id = :id");
    q1.bindValue(":id",idPromsModifier);
    q1.exec();
    q1.first();
    ui->lineProCentre->setText(q1.value(1).toString());
    ui->lineProAnnee->setText(q1.value(2).toString());
    ui->lineProStatut->setText(q1.value(3).toString());
    q1.finish();

    //Désactivation des cadres non utiles
    ui->tabWidget->setEnabled(false);
    ui->pageDetail->setEnabled(false);
    ui->listProProms->setEnabled(false);
    ui->buttonProNouveau->setEnabled(false);

    //Activation des entrées utiles
    ui->buttonProSupprimer->setEnabled(true);
    ui->groupProDetail->setEnabled(true);

}

void GUtils::on_buttonProAnnuler_clicked()
{
    //Activations désactivations
    ui->tabWidget->setEnabled(true);
    ui->pageDetail->setEnabled(true);
    ui->listProProms->setEnabled(true);
    ui->buttonProNouveau->setEnabled(true);
    ui->buttonProSupprimer->setEnabled(false);
    ui->groupProDetail->setEnabled(false);
    ui->listProProms->setCurrentIndex(QModelIndex());

    //Vidage des champs
    ui->lineProAnnee->setText("");
    ui->lineProCentre->setText("");
    ui->lineProStatut->setText("");

    idPromsModifier = 0;
}

void GUtils::on_buttonProValider_clicked()
{
    //Vérification des champs
    if(ui->lineProCentre->text().length() == 2 && ui->lineProAnnee->text().length() == 3){

        //Création de la requète d'insertion/modification
        QSqlQuery q1(db);
        if(idPromsModifier != 0){
            q1.prepare("UPDATE promotions SET centre = :c , annee = :a , statut = :s WHERE id = :i");
            q1.bindValue(":i",idPromsModifier);
        } else {
            q1.prepare("INSERT INTO promotions (centre, annee, statut) VALUES (:c,:a,:s)");
        }

        //Lien des valeurs dans la requête et execution
        q1.bindValue(":c",ui->lineProCentre->text());
        q1.bindValue(":a",ui->lineProAnnee->text());
        q1.bindValue(":s",ui->lineProStatut->text());
        q1.exec();
        q1.finish();
        //Remise à zéro du dock
        on_buttonProAnnuler_clicked();
    } else {
        QMessageBox::warning(this,"Champs incomplet","Vous devez remplir correctement les champs centre (deux lettres) et année (trois chiffres).");
    }

    modelListProms->setQuery("SELECT id, CONCAT(centre,' ',annee,statut) FROM promotions ORDER BY centre, annee",db);

}

void GUtils::on_buttonProNouveau_clicked()
{
    idPromsModifier = 0;

    //Désactivation des cadres non utiles
    ui->tabWidget->setEnabled(false);
    ui->pageDetail->setEnabled(false);
    ui->listProProms->setEnabled(false);
    ui->buttonProNouveau->setEnabled(false);

    //Activation des entrées utiles
    ui->buttonProSupprimer->setEnabled(true);
    ui->groupProDetail->setEnabled(true);
}

void GUtils::on_buttonProSupprimer_clicked()
{
    //Si une promotion est sélectionnée
    if(idPromsModifier != 0){

        //On supprime l'entrée correspondante
        QSqlQuery q1(db);
        q1.prepare("DELETE FROM promotions WHERE id = :i");
        q1.bindValue(":i",idPromsModifier);
        q1.exec();
        q1.finish();
    }

    modelListProms->setQuery("SELECT id, CONCAT(centre,' ',annee,statut) FROM promotions ORDER BY centre, annee",db);
}

void GUtils::on_tableUtilisateurs_clicked(const QModelIndex &index)
{
    //Récupération de l'id de l'utilisateur
    utilisateurSelected = index.model()->index(index.row(),0).data().toInt();

    if(utilisateurSelected != 0){
        //Récupération des informations
        QSqlQuery q1(db);
        q1.prepare("SELECT * FROM utilisateurs WHERE id = :i");
        q1.bindValue(":i",utilisateurSelected);
        q1.exec();
        q1.first();

        //Affichage des Détails
        ui->lineDetailNom->setText(q1.value(1).toString());
        ui->lineDetailPrenom->setText(q1.value(2).toString());
        ui->lineDetailTel->setText(q1.value(3).toString());
        ui->lineDetailMail->setText(q1.value(4).toString());
        ui->lineDetailBucque->setText(q1.value(5).toString());
        ui->lineDetailPseudo->setText(q1.value(8).toString());
        ui->lineDetailCode->setText(q1.value(10).toString());

        ui->spinDetailFams->setValue(q1.value(6).toInt());
        ui->comboDetailProms->setCurrentText(index.model()->index(index.row(),3).data().toString());

        //Mise a jour du boutton clore
        if(q1.value(12).toInt() == 0){
            ui->buttonUtilisateurClore->setText("Reactiver");
        }

        q1.finish();

        //Récupération des droits
        q1.prepare("SELECT username FROM v_droits WHERE utilisateur = :i");
        q1.bindValue(":i",utilisateurSelected);
        q1.exec();
        while(q1.next()){
            ui->listDetailDroits->addItem(q1.value(0).toString());
        }
        q1.finish();

        //Désactivation des autres blocs
        ui->tabUtilisateurs->setEnabled(false);
        ui->pageFiltre->setEnabled(false);
        ui->pagePromotions->setEnabled(false);

        //Activation du bloc
        ui->pageDetail->setEnabled(true);
        ui->toolBox->setCurrentIndex(1);
    }

}

void GUtils::on_buttonDetailAnnuler_clicked()
{
    utilisateurSelected = 0;

    //Désactivation du bloc
    ui->pageDetail->setEnabled(false);

    //Remise à zéro des détails
    ui->lineDetailNom->setText("");
    ui->lineDetailPrenom->setText("");
    ui->lineDetailTel->setText("");
    ui->lineDetailMail->setText("");
    ui->lineDetailBucque->setText("");
    ui->lineDetailPseudo->setText("");
    ui->lineDetailCode->setText("");
    ui->spinDetailFams->setValue(0);
    ui->listDetailDroits->clear();
    ui->buttonUtilisateurClore->setText("Clore");

    //Activation des autres blocs
    ui->tabUtilisateurs->setEnabled(true);
    ui->pageFiltre->setEnabled(true);
    ui->pagePromotions->setEnabled(true);
    ui->buttonUtilisateurClore->setEnabled(true);

}

void GUtils::on_buttonUtilisateurNouveau_clicked()
{
    //Définition de l'id de l'utilisateur
    utilisateurSelected = 0;

    //Remise à zéro des détails
    ui->lineDetailNom->setText("");
    ui->lineDetailPrenom->setText("");
    ui->lineDetailTel->setText("");
    ui->lineDetailMail->setText("");
    ui->lineDetailBucque->setText("");
    ui->lineDetailPseudo->setText("");
    ui->lineDetailCode->setText("");
    ui->spinDetailFams->setValue(0);
    ui->listDetailDroits->clear();

    //Désactivation des autres blocs
    ui->tabUtilisateurs->setEnabled(false);
    ui->pageFiltre->setEnabled(false);
    ui->pagePromotions->setEnabled(false);
    ui->buttonUtilisateurClore->setEnabled(false);

    //Activation du bloc
    ui->pageDetail->setEnabled(true);
    ui->toolBox->setCurrentIndex(1);

}

void GUtils::on_buttonDetailValider_clicked()
{
    //Vérification des Details
    bool verif = true;
    verif &= !ui->lineDetailNom->text().isEmpty();
    verif &= !ui->lineDetailPrenom->text().isEmpty();
    verif &= !ui->lineDetailBucque->text().isEmpty();
    verif &= (ui->spinDetailFams->value() > 0);
    verif &= !ui->comboDetailProms->currentText().isEmpty();

    int proms = modelListProms->index(ui->comboDetailProms->currentIndex(),0).data().toInt();

    verif &= (proms > 0);

    if(verif){
        //Création de la requète
        QSqlQuery q1(db);
        if(utilisateurSelected != 0){
            q1.prepare("UPDATE utilisateurs SET nom = :n, prenom = :pr, numeroTel = :t, mail = :m, bucque = :b, fams = :f, proms = :p, pseudo = :ps, code = :c WHERE id = :i");
            q1.bindValue(":i",utilisateurSelected);
        } else {
            q1.prepare("INSERT INTO utilisateurs (nom, prenom, numeroTel, mail, bucque, fams, proms, pseudo, code, mdp, solde, actif ) VALUES (:n,:pr,:t,:m,:b,:f,:p,:ps,:c,:mdp,:s,:a)");
            q1.bindValue(":mdp","defaut");
            q1.bindValue(":s",0.0);
            q1.bindValue(":a",1);
        }

        //Alienation des valeurs
        q1.bindValue(":n",ui->lineDetailNom->text());
        q1.bindValue(":pr",ui->lineDetailPrenom->text());
        q1.bindValue(":t",ui->lineDetailTel->text());
        q1.bindValue(":m",ui->lineDetailMail->text());
        q1.bindValue(":b",ui->lineDetailBucque->text());
        q1.bindValue(":f",ui->spinDetailFams->value());
        q1.bindValue(":p",proms);
        q1.bindValue(":ps",ui->lineDetailPseudo->text());
        q1.bindValue(":c",ui->lineDetailCode->text().toInt());

        //Execution de la requete
        q1.exec();
        q1.finish();

        q1.prepare("DELETE FROM droits WHERE utilisateur = :u");
        q1.bindValue(":u",utilisateurSelected);
        q1.exec();
        q1.finish();

        q1.prepare("INSERT INTO droits (utilisateur,username) VALUES (:u,get_id_username(:d))");
        q1.bindValue(":u",utilisateurSelected);
        for(int i = 0; i < ui->listDetailDroits->count(); i++){
            q1.bindValue(":d",ui->listDetailDroits->item(i)->text());
            q1.exec();
        }
        q1.finish();

        modelUtilisateurs->select();
        on_buttonDetailAnnuler_clicked();

    } else {
        QMessageBox::warning(this,"Erreur de saisie","Vous n'avez pas rempli tous les champs obligatoires.");
    }

}


void GUtils::on_buttonFiltreRAZ_clicked()
{

    modelUtilisateurs->setFilter("");

    //Vider les check box
    ui->checkFiltreActif->setChecked(false);
    ui->checkFiltreBucque->setChecked(false);
    ui->checkFiltreMail->setChecked(false);
    ui->checkFiltreNom->setChecked(false);
    ui->checkFiltrePrenom->setChecked(false);
    ui->checkFiltrePseudo->setChecked(false);
    ui->checkFiltreTel->setChecked(false);
    ui->checkFiltreProms->setChecked(false);

    //Vider les line edit et spin
    ui->lineFiltreRecherche->setText("");
    ui->spinFiltreFams->setValue(0);
    ui->spinFiltreSoldeMax->setValue(1000.0);
    ui->spinFiltreSoldeMin->setValue(-1000.0);

    //Désactiver les groupBox
    ui->groupFiltreRecherche->setChecked(false);
    ui->groupFiltreSolde->setChecked(false);
    ui->groupFiltreActif->setChecked(false);
    ui->groupFiltreFams->setChecked(false);


}

void GUtils::on_buttonFiltreFiltrer_clicked()
{
    //Création de la chaine de filtre et du test premier filtre
    QString f = "";
    bool first = true;

    //Application de la recherche
    if(ui->groupFiltreRecherche->isChecked()){
        bool ok = false;
        if(ui->checkFiltreNom->isChecked()){
            f += "nom LIKE '%";
            ok = true;
        }
        if(ui->checkFiltrePrenom->isChecked()){
            f += "prenom LIKE '%";
            ok = true;
        }
        if(ui->checkFiltreTel->isChecked()){
            f += "numeroTel LIKE '%";
            ok = true;
        }
        if(ui->checkFiltreMail->isChecked()){
            f += "mail LIKE '%";
            ok = true;
        }
        if(ui->checkFiltreBucque->isChecked()){
            f += "bucque LIKE '%";
            ok = true;
        }
        if(ui->checkFiltrePseudo->isChecked()){
            f += "pseudo LIKE '%";
            ok = true;
        }
        //Application du filtre uniquement si une case au moins est cochée
        if(ok){
            f += ui->lineFiltreRecherche->text() + "%'";
            first = false;
        }
    }

    //Application du filtre fams proms
    if(ui->groupFiltreFams->isChecked()){
        if(ui->spinFiltreFams->value()>0){
            if(!first){
                f += " AND ";
            }
            f+= "fams = "+QString::number(ui->spinFiltreFams->value());
            first = false;
        }
        if(ui->checkFiltreProms->isChecked()){
            if(!first){
                f += " AND ";
            }
            f+= "proms = '"+ui->comboFiltreProms->currentText()+"'";
            first = false;
        }
    }

    //Application du filtre solde
    if(ui->groupFiltreSolde->isChecked()){
        if(!first){
            f += " AND ";
        }

        f+= "solde <= "+QString::number(ui->spinFiltreSoldeMax->value())+" AND solde >= "+ QString::number(ui->spinFiltreSoldeMin->value());
        first = false;
    }

    //Application du filtre actif
    if(ui->groupFiltreActif->isChecked()){
        if(!first){
            f += " AND ";
        }

        f+= "actif = ";
        if(ui->checkFiltreActif->isChecked()){
            f+="1";
        }else{
            f+="0";
        }
        first = false;
    }

    //Application du filtre au model
    modelUtilisateurs->setFilter(f);
}


void GUtils::on_buttonDetailMdp_clicked()
{
    //On demande le mot de passe et la confirmation
    bool ok = false;
    QString mdp1 = QInputDialog::getText(this,"Mot de passe","Entrez nouveau mot de passe",QLineEdit::Password,"",&ok);
    if(!ok){
        return;
    }
    QString mdp2 = QInputDialog::getText(this,"Mot de passe","Entrez nouveau mot de passe",QLineEdit::Password,"",&ok);
    if(!ok){
        return;
    }

    //Si les deux mots de passe correspondent ...
    if(mdp1 == mdp2){
        //... et que la longueur n'excede pas celle critique
        if(mdp1.length()>30){
            QMessageBox::critical(this,"Erreur","Mot de passe trop long (30 caractères max)");
            return;
        }

        //On appelle la procédure de changement
        QSqlQuery q1(db);
        q1.prepare("CALL changer_mdp(:i,:m)");
        q1.bindValue(":i",utilisateurSelected);
        q1.bindValue(":m",mdp1);
        q1.exec();
        q1.finish();

    } else {
        QMessageBox::critical(this,"Erreur","Les mots de passe ne correspondent pas");
        return;
    }
}

void GUtils::on_buttonDetailAccorder_clicked()
{
    //On créer la liste des droits
    QStringList l;
    l << "Moderateur" << "Administrateur" << "Tonton" ;

    //On demande le droit à accorder
    bool ok = false;
    QString s = QInputDialog::getItem(this,"Droit","Sélectionner le droit à accorder",l,0,false,&ok);
    if(!ok){
        return;
    }

    //Si il n'est pas dans la liste, on l'ajoute
    if(ui->listDetailDroits->findItems(s,Qt::MatchExactly).size() == 0){
        ui->listDetailDroits->addItem(s);
    }
}



void GUtils::on_listDetailDroits_clicked(const QModelIndex &index)
{
    ui->listDetailDroits->takeItem(ui->listDetailDroits->currentRow());
}

void GUtils::on_buttonUtilisateurClore_clicked()
{
    //Création de la requete
    QSqlQuery q1(db);
    q1.prepare("UPDATE utilisateurs SET Actif = :a WHERE id = :i");
    q1.bindValue(":i",utilisateurSelected);

    //Si l'utilisateur est actif on place 0 dans actif
    if(ui->buttonUtilisateurClore->text() == "Clore"){
        q1.bindValue(":a",0);

    }else{
        q1.bindValue(":a",1);

    }

    //Si la requete s'execute, on modifie le button
    if(q1.exec()){
        ui->buttonUtilisateurClore->text() == "Clore" ? ui->buttonUtilisateurClore->setText("Reactiver") : ui->buttonUtilisateurClore->setText("Clore");
        q1.finish();
    }
}

void GUtils::on_buttonVirIntCalculer_clicked()
{
    QSqlQuery q1(db);
    q1.prepare("SELECT get_racine(ca.id), ca.nom, COUNT(*), SUM(h.montant) FROM historique AS h, consos AS c, categories AS ca WHERE h.conso=c.id AND c.categorie=ca.id AND h.date_hst >= :inf AND h.date_hst < :sup GROUP BY ca.id");
    q1.bindValue(":inf",ui->dateVirIntDu->dateTime().toString("yyyy-MM-dd hh:mm:ss"));
    q1.bindValue(":sup",ui->dateVirIntAu->dateTime().toString("yyyy-MM-dd hh:mm:ss"));
    q1.exec();
    modelVirInt->setQuery(q1);
    modelVirInt->setHeaderData(0,Qt::Horizontal,"Id");
    modelVirInt->setHeaderData(1,Qt::Horizontal,"Catégorie");
    modelVirInt->setHeaderData(2,Qt::Horizontal,"Nombre");
    modelVirInt->setHeaderData(3,Qt::Horizontal,"Somme");
    ui->tableVirInt->hideColumn(0);



}

void GUtils::on_buttonVirIntImprimer_clicked()
{
    // Création de la classe rapport
    QModelDataReport *rapport = new QModelDataReport(modelVirInt,this);

    // Création des listes de paramètres
    QList<int> listofcolumns;
    QList<int> listofwidth;
    QStringList listofheader;
    QList<int> alignment;
    QList<QModelDataReport::dataFormat> tableformat;
    QList<QVariant> listTotaux;

    // Initialisation des formats spéciaux
    QModelDataReport::dataFormat dformatstring;
    dformatstring.strFormat="%1";
    dformatstring.typeFormat=QModelDataReport::typeIsQString;
    dformatstring.fieldwidthFormat=0;
    dformatstring.fillFormat="";
    QModelDataReport::dataFormat dformatdate;
    dformatdate.strFormat="%1";
    dformatdate.typeFormat=QModelDataReport::typeIsQDate;
    dformatdate.fieldwidthFormat=0;
    dformatdate.fillFormat="dd-MM-yy";
    QModelDataReport::dataFormat dformateuro;
    dformateuro.strFormat="%1€";
    dformateuro.typeFormat=QModelDataReport::typeIsCurrency;
    dformateuro.fieldwidthFormat=12;
    dformateuro.fillFormat="";

    // Initialisation des listes
    listofcolumns << 1 << 2 << 3 ;
    listofheader << "Catégorie" << "Nombre de consos" << "Montant" ;
    alignment << (Qt::AlignLeft| Qt::AlignVCenter) << (Qt::AlignRight | Qt::AlignVCenter) << (Qt::AlignRight | Qt::AlignVCenter) ;
    tableformat << dformatstring << dformatstring << dformateuro ;
    listTotaux << 0 << 0 << 0 ;

    // On passe les listes en paramètres
    rapport->setListofColumns(&listofcolumns);
    rapport->setColumnWidthPercentage(&listofwidth);
    rapport->setListofColumnsHeader(&listofheader);
    rapport->setCellsAlignment(&alignment);
    rapport->setCellsDataFormat(&tableformat);

    // On récupère le total
    rapport->getSumOfnumColumns(&listTotaux);

    // Définition des polices
    QFont font = this->font();
        // Titre
    font.setPointSize(16);
    rapport->setTitleFont(font);
    rapport->setTitleText("Consomations");
        // Corps
    font.setPointSize(8);
    rapport->setBodyFont(font);
        // Headers
    font.setPointSize(12);
    rapport->setHeaderPageFont(font);
    rapport->setHeaderPageLeftText("Du : "+ui->dateVirIntDu->text());
    rapport->setHeaderPageRightText("Au : "+ui->dateVirIntAu->text());
        // Sous-titre
    font.setPointSize(12);
    rapport->setHeaderReportFont(font);
    rapport->setHeaderReportHeight(25);
    rapport->setHeaderReportText("Somme des consomations sur le système pour la période ci-dessous, groupées par activité.");
        // Pied
    font.setPointSize(12);
    rapport->setFooterPageFont(font);
    rapport->setFooterPageRightText("AE ENSAM Angers");
    rapport->setFooterPageLeftText("Le "+QDate::currentDate().toString("dddd d MMMM yyyy"));

    // Impression
    rapport->model_print();
}

void GUtils::on_buttonUtilisateurHistorique_clicked()
{
    if(ui->tableUtilisateurs->currentIndex().isValid()){

        int id = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),0).data().toInt();
        QString bucque = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),1).data().toString();
        QString fams = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),2).data().toString();
        QString proms = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),3).data().toString();

        QSqlTableModel *m = new QSqlTableModel(0,db);
        m->setTable("v_hist");
        m->setHeaderData(1,Qt::Horizontal,"Date");
        m->setHeaderData(7,Qt::Horizontal,"Intitulé");
        m->setHeaderData(8,Qt::Horizontal,"Montant");
        m->setFilter("compte = "+QString::number(id));

        m->select();

        TableViewDialog *d = new TableViewDialog(m,true,this);
        d->setWindowTitle("Historique");
        d->totalColumn(8);


        d->hideColumn(0);
        d->hideColumn(2);
        d->hideColumn(3);
        d->hideColumn(4);
        d->hideColumn(5);
        d->hideColumn(6);


        MoneyDelegate *del = new MoneyDelegate(0);
        d->setDelegateForColumn(8,del);


        QList<QModelDataReport::dataFormat> tableformat;
        tableformat << d->dformatdatetime() << d->dformatstring() << d->dformateuro();
        d->setTableFormat(tableformat);

        d->setTitle("Historique");
        d->setHeaderText(bucque + " " + fams + " " + proms);

        d->show();

    }

}

void GUtils::on_buttonUtilisateurTransactions_clicked()
{
    if(ui->tableUtilisateurs->currentIndex().isValid()){

        int id = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),0).data().toInt();
        QString bucque = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),1).data().toString();
        QString fams = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),2).data().toString();
        QString proms = modelUtilisateurs->index(ui->tableUtilisateurs->currentIndex().row(),3).data().toString();

        QSqlQueryModel *m = new QSqlQueryModel(0);
        m->setQuery("SELECT tdate, IF(deb_id = " + QString::number(id) + ",CONCAT(cre_pseudo,' ',cre_proms),CONCAT(deb_pseudo,' ',deb_proms)) AS contrepartie, libelle , IF(deb_id = " + QString::number(id) + ",-montant,'') AS debit, IF(deb_id = " + QString::number(id) + ",'',montant) AS credit FROM (SELECT * FROM v_transactions WHERE deb_id = " + QString::number(id) + " OR cre_id = " + QString::number(id) + ") AS trans",db);

        m->setHeaderData(0,Qt::Horizontal,"Date");
        m->setHeaderData(1,Qt::Horizontal,"Contrepartie");
        m->setHeaderData(2,Qt::Horizontal,"Libellé");
        m->setHeaderData(3,Qt::Horizontal,"Débit");
        m->setHeaderData(4,Qt::Horizontal,"Crédit");

        TableViewDialog *d = new TableViewDialog(m,false,this);
        d->setWindowTitle("Transactions");
        d->totalColumn(3);
        d->totalColumn(4);


        MoneyDelegate *del = new MoneyDelegate(0,false);
        d->setDelegateForColumn(3,del);
        d->setDelegateForColumn(4,del);

        QList<QModelDataReport::dataFormat> tableformat;
        tableformat << d->dformatdatetime() << d->dformatstring()<< d->dformatstring() << d->dformateuro()<< d->dformateuro();
        d->setTableFormat(tableformat);

        QList<int> listofwidth;
        listofwidth << 15 << 30 << 39 << 8 << 8;
        d->setListofWidth(listofwidth);

        d->setTitle("Transactions");
        d->setHeaderText(bucque + " " + fams + " " + proms);

        d->show();

    }
}
